home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 …ember: Reference Library / Dev.CD Dec 00 RL Disk 1.toast / pc / technical documentation / develop / develop issue 26 / develop issue 26 code / som and listpart / listpart dr4 / source / samplecollections.cpp < prev    next >
Encoding:
Text File  |  1995-11-08  |  13.1 KB  |  633 lines

  1. /*
  2.     File:        Collections.cpp
  3.  
  4.     Contains:    Sample collection functions & classes
  5.  
  6.     Written by:    Steve Smith
  7.  
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Description:
  11.                 CList: Generic unordered list
  12.                 COrderedList: Generic ordered list
  13.                 CFrameList: Unordered list of frames -
  14.                             frames automatically refcounted when 
  15.                             added/removed from list.
  16.                 CQueue: Generic queue collection
  17.                 CStack: Generic stack collection
  18. */
  19.  
  20.  
  21. // -- Compiler/Preprocessor Switches --
  22.  
  23. #ifndef _COMPILERDEFS_
  24. #include "CompDefs.h"
  25. #endif
  26.  
  27. // -- OpenDoc Utilities --
  28.  
  29. #ifndef _EXCEPT_
  30. // Exceptions define several important macros (ie. CHECKENV)
  31. // which are used in the SOM method dispatch glue. If Except.h
  32. // is not included early enough, exceptions may not be thrown
  33. // correctly when returning from a SOM method with "ev" parameter set.
  34. #include <Except.h>
  35. #endif
  36.  
  37. // --- ListPart Includes ---
  38.  
  39. #ifndef _SAMPLECOLLECTIONS_
  40. #include "SampleCollections.h"
  41. #endif
  42.  
  43. // --- OpenDoc Includes ---
  44.  
  45. #ifndef _ODTYPES_
  46. #include <ODTypes.h>
  47. #endif
  48.  
  49. #ifndef SOM_ODFrame_xh
  50. #include <Frame.xh>
  51. #endif
  52.  
  53. #ifndef SOM_ODDraft_xh
  54. #include <Draft.xh>
  55. #endif
  56.  
  57. #ifndef SOM_Module_OpenDoc_Errors_defined
  58. #include <ErrorDef.h>
  59. #endif
  60.  
  61. // --- OpenDoc Utilities ---
  62.  
  63. #ifndef _ODDEBUG_
  64. #include <ODDebug.h>
  65. #endif
  66.  
  67. #ifndef _ODNEW_
  68. #include <ODNew.h>
  69. #endif
  70.  
  71. #ifndef _LINKLIST_
  72. #include <LinkList.h>
  73. #endif
  74.  
  75. #ifndef _ODUTILS_
  76. #include <ODUtils.h>
  77. #endif
  78.  
  79.  
  80. //====================================================================
  81. // CFrameLink
  82. //====================================================================
  83.  
  84. CFrameLink::CFrameLink(ODFrame* frame)
  85.     :CGenericLink()
  86. {
  87.     Environment* ev = somGetGlobalEnvironment();
  88.     ODAcquireObject(ev, frame);
  89.     fValue = (ODPtr)frame;
  90. }
  91.  
  92. CFrameLink::~CFrameLink()
  93. {
  94.     Environment* ev = somGetGlobalEnvironment();
  95.     ODFrame* currentFrame = (ODFrame*)fValue;
  96.     ODReleaseObject(ev, currentFrame);
  97. }
  98.  
  99. ODFrame* CFrameLink::GetFrame()
  100. {
  101.     return ((ODFrame*)fValue);
  102. }
  103.  
  104. void CFrameLink::SetFrame(ODFrame* frame)
  105. {
  106.     Environment* ev = somGetGlobalEnvironment();
  107.     ODAcquireObject(ev, frame);
  108.     
  109.     ODFrame* currentFrame = (ODFrame*)fValue;
  110.     ODReleaseObject(ev, currentFrame);
  111.     
  112.     fValue = (ODPtr)frame;
  113. }
  114.  
  115. //====================================================================
  116. // CList
  117. //====================================================================
  118.  
  119. ODBoolean CList::Contains(const ODPtr value)
  120. {
  121.     if ( fList.IsEmpty() ) return kODFalse;
  122.     
  123.     LinkedListIterator    iter(&fList);
  124.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  125.     {
  126.         if ( ((CGenericLink*)link)->GetValue() == value )
  127.             return kODTrue;
  128.     }
  129.  
  130.     return kODFalse;
  131. }
  132.  
  133. void CList::DeleteAllLinks()
  134. {
  135.     LinkedListIterator    iter(&fList);
  136.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  137.     {
  138.         delete (((CGenericLink*)link)->GetValue());
  139.     }
  140.     fList.RemoveAll();
  141. }
  142.  
  143. void CList::Delete(ODPtr value)
  144. {
  145.     LinkedListIterator    iter(&fList);
  146.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  147.     {
  148.         if ( ((CGenericLink*)link)->GetValue() == value )
  149.         {
  150.             delete (((CGenericLink*)link)->GetValue());
  151.             fList.Remove(*link);
  152.             return;
  153.         }
  154.     }
  155. }
  156.  
  157. void CList::Remove(ODPtr value)
  158. {
  159.     LinkedListIterator    iter(&fList);
  160.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  161.     {
  162.         if ( ((CGenericLink*)link)->GetValue() == value )
  163.         {
  164.             fList.Remove(*link);
  165.             return;
  166.         }
  167.     }
  168. }
  169.  
  170. void CList::Add(ODPtr value)
  171. {
  172.     CGenericLink* link = new CGenericLink(value);
  173.     fList.AddLast(link);
  174. }
  175.  
  176.  
  177. //====================================================================
  178. // CListIterator
  179. //====================================================================
  180.  
  181. CListIterator::CListIterator(CList* list)
  182. {
  183.     fIter = new LinkedListIterator(&list->fList);
  184. }
  185.  
  186. CListIterator::~CListIterator()
  187. {
  188.     delete fIter;
  189. }
  190.     
  191. ODPtr CListIterator::First()
  192. {
  193.     CGenericLink* link = (CGenericLink*) fIter->First();
  194.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  195. }
  196.  
  197. ODPtr CListIterator::Next()
  198. {
  199.     CGenericLink* link = (CGenericLink*) fIter->Next();
  200.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  201. }
  202.  
  203. ODPtr CListIterator::Previous()
  204. {
  205.     CGenericLink* link = (CGenericLink*) fIter->Previous();
  206.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  207. }
  208.  
  209. ODPtr CListIterator::Last()
  210. {
  211.     CGenericLink* link = (CGenericLink*) fIter->Last();
  212.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  213. }
  214.  
  215. ODPtr CListIterator::Current()
  216. {
  217.     CGenericLink* link = (CGenericLink*) fIter->Current();
  218.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  219. }
  220.  
  221. ODBoolean CListIterator::IsNotComplete()
  222. {
  223.     return fIter->IsNotComplete();
  224. }
  225.  
  226. void CListIterator::RemoveCurrent()
  227. {
  228.     fIter->RemoveCurrent();
  229. }
  230.  
  231. void CListIterator::DeleteCurrent()
  232. {
  233.     CGenericLink* link = (CGenericLink*) fIter->Current();
  234.     fIter->RemoveCurrent();
  235.     if ( link ) {
  236.         delete link->GetValue();
  237.         delete link;
  238.     }
  239. }
  240.  
  241. //====================================================================
  242. // COrderedList
  243. //====================================================================
  244.  
  245. ODBoolean COrderedList::Contains(const ODPtr value)
  246. {
  247.     if ( fList.IsEmpty() ) return kODFalse;
  248.     
  249.     LinkedListIterator    iter(&fList);
  250.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  251.     {
  252.         if ( ((CGenericLink*)link)->GetValue() == value )
  253.             return kODTrue;
  254.     }
  255.  
  256.     return kODFalse;
  257. }
  258.  
  259. ODUShort COrderedList::Position(const ODPtr value)
  260. {
  261.     if ( fList.IsEmpty() ) return kListIsEmpty;
  262.     
  263.     ODUShort position = 0;
  264.     LinkedListIterator    iter(&fList);
  265.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  266.     {
  267.         position++;
  268.         if ( ((CGenericLink*)link)->GetValue() == value )
  269.             return kODTrue;
  270.     }
  271.  
  272.     return kItemNotFound;
  273. }
  274.  
  275. void COrderedList::DeleteAllLinks()
  276. {
  277.     LinkedListIterator    iter(&fList);
  278.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  279.     {
  280.         delete (((CGenericLink*)link)->GetValue());
  281.     }
  282.     fList.RemoveAll();
  283. }
  284.  
  285. void COrderedList::Delete(ODPtr value)
  286. {
  287.     LinkedListIterator    iter(&fList);
  288.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  289.     {
  290.         if ( ((CGenericLink*)link)->GetValue() == value )
  291.         {
  292.             delete (((CGenericLink*)link)->GetValue());
  293.             fList.Remove(*link);
  294.             return;
  295.         }
  296.     }
  297. }
  298.  
  299. void COrderedList::Remove(ODPtr value)
  300. {
  301.     LinkedListIterator    iter(&fList);
  302.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  303.     {
  304.         if ( ((CGenericLink*)link)->GetValue() == value )
  305.         {
  306.             fList.Remove(*link);
  307.             return;
  308.         }
  309.     }
  310. }
  311.  
  312. ODPtr COrderedList::RemoveFirst()
  313. {
  314.     CGenericLink* link = (CGenericLink*) fList.RemoveFirst();
  315.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  316. }
  317.  
  318. ODPtr COrderedList::RemoveLast()
  319. {
  320.     CGenericLink* link = (CGenericLink*) fList.RemoveLast();
  321.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  322. }
  323.  
  324. void COrderedList::AddBefore(const ODPtr existing, ODPtr value)
  325. {
  326.     LinkedListIterator    iter(&fList);
  327.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  328.     {
  329.         if ( ((CGenericLink*)link)->GetValue() == existing )
  330.         {
  331.             CGenericLink* newLink = new CGenericLink(value);
  332.             fList.AddBefore(*link,newLink);
  333.             return;
  334.         }
  335.     }
  336. }
  337.  
  338. void COrderedList::AddAfter(const ODPtr existing, ODPtr value)
  339. {
  340.     LinkedListIterator    iter(&fList);
  341.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  342.     {
  343.         if ( ((CGenericLink*)link)->GetValue() == existing )
  344.         {
  345.             CGenericLink* newLink = new CGenericLink(value);
  346.             fList.AddAfter(*link,newLink);
  347.             return;
  348.         }
  349.     }
  350. }
  351.  
  352. void COrderedList::AddFirst(ODPtr value)
  353. {
  354.     CGenericLink* link = new CGenericLink(value);
  355.     fList.AddFirst(link);
  356. }
  357.  
  358. void COrderedList::AddLast(ODPtr value)
  359. {
  360.     CGenericLink* link = new CGenericLink(value);
  361.     fList.AddLast(link);
  362. }
  363.  
  364. ODPtr COrderedList::After(const ODPtr value) const
  365. {
  366.     LinkedListIterator    iter((LinkedList*)&fList);
  367.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  368.     {
  369.         if ( ((CGenericLink*)link)->GetValue() == value )
  370.         {
  371.             Link* after = fList.After(*link);
  372.             return (ODPtr)((CGenericLink*)after)->GetValue();
  373.         }
  374.     }
  375.     return kODNULL;
  376. }
  377.  
  378. ODPtr COrderedList::Before(const ODPtr value) const
  379. {
  380.     LinkedListIterator    iter((LinkedList*)&fList);
  381.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  382.     {
  383.         if ( ((CGenericLink*)link)->GetValue() == value )
  384.         {
  385.             Link* after = fList.Before(*link);
  386.             return (ODPtr)((CGenericLink*)after)->GetValue();
  387.         }
  388.     }
  389.     return kODNULL;
  390. }
  391.  
  392. ODPtr COrderedList::First() const
  393. {
  394.     CGenericLink* link = (CGenericLink*) fList.First();
  395.     return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
  396. }
  397.  
  398. ODPtr COrderedList::Last() const
  399. {
  400.     CGenericLink* link = (CGenericLink*) fList.Last();
  401.     return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
  402. }
  403.  
  404.  
  405. //====================================================================
  406. // CFrameList
  407. //====================================================================
  408.  
  409. CFrameList::~CFrameList()
  410. {
  411.     Environment* ev = somGetGlobalEnvironment();
  412.     
  413.     LinkedListIterator    iter(&fList);
  414.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  415.     {
  416.         iter.RemoveCurrent();
  417.         delete link;
  418.     }
  419. }
  420.  
  421. ODBoolean CFrameList::Contains(const ODFrame* frame)
  422. {
  423.     if ( fList.IsEmpty() ) return kODFalse;
  424.     
  425.     Environment* ev = somGetGlobalEnvironment();
  426.  
  427.     LinkedListIterator    iter(&fList);
  428.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  429.     {
  430.         if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), (ODFrame*)frame) )
  431.             return kODTrue;
  432.     }
  433.  
  434.     return kODFalse;
  435. }
  436.  
  437. void CFrameList::Remove(ODFrame* frame)
  438. {
  439.     Environment* ev = somGetGlobalEnvironment();
  440.     Link* link = kODNULL;
  441.     
  442.     LinkedListIterator    iter(&fList);
  443.     for ( link=iter.First();iter.IsNotComplete();link=iter.Next())
  444.     {
  445.         if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), frame) )
  446.             break;
  447.     }
  448.     
  449.     fList.Remove(*link);
  450.     delete link;
  451. }
  452.  
  453. void CFrameList::Add(ODFrame* frame)
  454. {
  455.     CFrameLink* link = new CFrameLink(frame);
  456.     fList.AddLast(link);
  457. }
  458.  
  459. ODFrame* CFrameList::GetFrame()
  460. {
  461.     CFrameLink* link = (CFrameLink*) fList.First();
  462.     return link->GetFrame();
  463. }
  464.  
  465. //====================================================================
  466. // CFrameListIterator
  467. //====================================================================
  468.  
  469. CFrameListIterator::CFrameListIterator(CFrameList* list)
  470. {
  471.     fIter = new LinkedListIterator(&list->fList);
  472. }
  473.  
  474. CFrameListIterator::~CFrameListIterator()
  475. {
  476.     delete fIter;
  477. }
  478.     
  479. ODFrame* CFrameListIterator::First()
  480. {
  481.     CFrameLink* link = (CFrameLink*) fIter->First();
  482.     return link ? link->GetFrame() : kODNULL;
  483. }
  484.  
  485. ODFrame* CFrameListIterator::Next()
  486. {
  487.     CFrameLink* link = (CFrameLink*) fIter->Next();
  488.     return link ? link->GetFrame() : kODNULL;
  489. }
  490.  
  491. ODFrame* CFrameListIterator::Previous()
  492. {
  493.     CFrameLink* link = (CFrameLink*) fIter->Previous();
  494.     return link ? link->GetFrame() : kODNULL;
  495. }
  496.  
  497. ODFrame* CFrameListIterator::Last()
  498. {
  499.     CFrameLink* link = (CFrameLink*) fIter->Last();
  500.     return link ? link->GetFrame() : kODNULL;
  501. }
  502.  
  503. ODFrame* CFrameListIterator::Current()
  504. {
  505.     CFrameLink* link = (CFrameLink*) fIter->Current();
  506.     return link ? link->GetFrame() : kODNULL;
  507. }
  508.  
  509. ODBoolean CFrameListIterator::IsNotComplete()
  510. {
  511.     return fIter->IsNotComplete();
  512. }
  513.  
  514. void CFrameListIterator::ReleaseCurrent()
  515. {
  516.     Environment* ev = somGetGlobalEnvironment();
  517.  
  518.     CFrameLink* link = (CFrameLink*) fIter->Current();
  519.     if ( link )
  520.         link->GetFrame()->Release(ev);
  521.     fIter->RemoveCurrent();
  522. }
  523.  
  524. //====================================================================
  525. // CStack
  526. //====================================================================
  527.  
  528. void CStack::EmptyStack(ODBoolean deleteEntries)
  529. {
  530.     if ( deleteEntries )
  531.     {
  532.         LinkedListIterator    iter(&fStack);
  533.         for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  534.         {
  535.             delete (((CGenericLink*)link)->GetValue());
  536.             fStack.Remove(*link);
  537.         }
  538.     }
  539.     else
  540.         fStack.DeleteAllLinks();
  541. }
  542.  
  543. ODUShort CStack::SetSize(ODUShort maxDepth)
  544. {
  545.     ODULong curSize = fStack.Count();
  546.     
  547.     if ( curSize > maxDepth )
  548.         fMaxDepth = (ODUShort) curSize;
  549.     else
  550.         fMaxDepth = maxDepth;
  551.     
  552.     return fMaxDepth;
  553. }
  554.  
  555. ODBoolean CStack::PushEntry(ODPtr entry)
  556. {
  557.     if ( (ODUShort)fStack.Count() < fMaxDepth )
  558.     {
  559.         CGenericLink* link = new CGenericLink(entry);
  560.         fStack.AddFirst(link);
  561.         return kODTrue;
  562.     }
  563.     else
  564.         return kODFalse;
  565. }
  566.  
  567. ODPtr CStack::PopEntry()
  568. {
  569.     if ( fStack.IsEmpty() )
  570.         return kODNULL;
  571.     else
  572.     {
  573.         CGenericLink* link = (CGenericLink*)fStack.RemoveFirst();
  574.         return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  575.     }
  576. }
  577.  
  578.  
  579. //====================================================================
  580. // CQueue
  581. //====================================================================
  582.  
  583. void CQueue::EmptyQueue(ODBoolean deleteEntries)
  584. {
  585.     if ( deleteEntries )
  586.     {
  587.         LinkedListIterator    iter(&fQueue);
  588.         for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  589.         {
  590.             delete (((CGenericLink*)link)->GetValue());
  591.             fQueue.Remove(*link);
  592.         }
  593.     }
  594.     else
  595.         fQueue.DeleteAllLinks();
  596. }
  597.  
  598. ODUShort CQueue::SetSize(ODUShort maxEntries)
  599. {
  600.     ODULong curSize = fQueue.Count();
  601.     
  602.     if ( curSize > maxEntries )
  603.         fMaxEntries = (ODUShort) curSize;
  604.     else
  605.         fMaxEntries = maxEntries;
  606.     
  607.     return fMaxEntries;
  608. }
  609.  
  610. ODBoolean CQueue::AddEntry(ODPtr entry)
  611. {
  612.     if ( (ODUShort)fQueue.Count() < fMaxEntries )
  613.     {
  614.         CGenericLink* link = new CGenericLink(entry);
  615.         fQueue.AddLast(link);
  616.         return kODTrue;
  617.     }
  618.     else
  619.         return kODFalse;
  620. }
  621.  
  622. ODPtr CQueue::GetEntry()
  623. {
  624.     if ( fQueue.IsEmpty() )
  625.         return kODNULL;
  626.     else
  627.     {
  628.         CGenericLink* link = (CGenericLink*)fQueue.RemoveFirst();
  629.         return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  630.     }
  631. }
  632.  
  633.